cssparser: Introduce gtk_css_parser_consume_function()
authorBenjamin Otte <otte@redhat.com>
Sun, 24 Mar 2019 20:11:53 +0000 (21:11 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 12 Apr 2019 17:34:28 +0000 (19:34 +0200)
This is a vfunc-based function parser.

gtk/gtkcssparser.c
gtk/gtkcssparserprivate.h

index 295b3c1cdef1f5c10939dde0bac1afeec79131d4..29cb921a29cc9754ef94a388eed4b37dc597c12d 100644 (file)
@@ -337,6 +337,20 @@ gtk_css_parser_try_token (GtkCssParser    *parser,
       _gtk_css_parser_skip_whitespace (parser);
       return TRUE;
 
+    case GTK_CSS_TOKEN_OPEN_PARENS:
+      if (*parser->data != '(')
+        return FALSE;
+      parser->data += 1;
+      _gtk_css_parser_skip_whitespace (parser);
+      return TRUE;
+
+    case GTK_CSS_TOKEN_CLOSE_PARENS:
+      if (*parser->data != ')')
+        return FALSE;
+      parser->data += 1;
+      _gtk_css_parser_skip_whitespace (parser);
+      return TRUE;
+
     case GTK_CSS_TOKEN_COMMA:
       if (*parser->data != ',')
         return FALSE;
@@ -371,8 +385,6 @@ gtk_css_parser_try_token (GtkCssParser    *parser,
     case GTK_CSS_TOKEN_DIMENSION:
     case GTK_CSS_TOKEN_EOF:
     case GTK_CSS_TOKEN_WHITESPACE:
-    case GTK_CSS_TOKEN_OPEN_PARENS:
-    case GTK_CSS_TOKEN_CLOSE_PARENS:
     case GTK_CSS_TOKEN_OPEN_SQUARE:
     case GTK_CSS_TOKEN_CLOSE_SQUARE:
     case GTK_CSS_TOKEN_CDC:
@@ -767,6 +779,17 @@ _gtk_css_parser_try_double (GtkCssParser *parser,
   return TRUE;
 }
 
+gboolean
+gtk_css_parser_consume_number (GtkCssParser *self,
+                               double       *number)
+{
+  if (_gtk_css_parser_try_double (self, number))
+    return TRUE;
+  
+  _gtk_css_parser_error (self, "Expected a number");
+  return FALSE;
+}
+
 gboolean
 _gtk_css_parser_has_number (GtkCssParser *parser)
 {
@@ -1143,3 +1166,60 @@ out:
   g_string_append_c (str, '"');
 }
 
+gboolean
+gtk_css_parser_consume_function (GtkCssParser *self,
+                                 guint         min_args,
+                                 guint         max_args,
+                                 guint (* parse_func) (GtkCssParser *, guint, gpointer),
+                                 gpointer      data)
+{
+  gboolean result = FALSE;
+  char *function_name;
+  guint arg;
+
+  function_name = _gtk_css_parser_try_ident (self, FALSE);
+  g_return_val_if_fail (function_name != NULL, FALSE);
+  g_return_val_if_fail (_gtk_css_parser_try (self, "(", TRUE), FALSE);
+
+  arg = 0;
+  while (TRUE)
+    {
+      guint parse_args = parse_func (self, arg, data);
+      if (parse_args == 0)
+        break;
+      arg += parse_args;
+      if (gtk_css_parser_try_token (self, GTK_CSS_TOKEN_CLOSE_PARENS))
+        {
+          if (arg < min_args)
+            {
+              _gtk_css_parser_error (self, "%s() requires at least %u arguments", function_name, min_args);
+              break;
+            }
+          else
+            {
+              result = TRUE;
+              break;
+            }
+        }
+      else if (gtk_css_parser_try_token (self, GTK_CSS_TOKEN_COMMA))
+        {
+          if (arg >= max_args)
+            {
+              _gtk_css_parser_error (self, "Expected ')' at end of %s()", function_name);
+              break;
+            }
+
+          continue;
+        }
+      else
+        {
+          _gtk_css_parser_error (self, "Unexpected data at end of %s() argument", function_name);
+          break;
+        }
+    }
+
+  g_free (function_name);
+
+  return result;
+}
+
index 22973526c541f4550fde1ff5fedb3eeb903aa7f3..019d417f1607205945db19ecd81154037b32d068 100644 (file)
@@ -83,6 +83,14 @@ gboolean        _gtk_css_parser_try_double        (GtkCssParser          *parser
 gboolean        _gtk_css_parser_try_hash_color    (GtkCssParser          *parser,
                                                    GdkRGBA               *rgba);
 
+gboolean        gtk_css_parser_consume_number     (GtkCssParser          *self,
+                                                   double                *number);
+gboolean        gtk_css_parser_consume_function   (GtkCssParser          *self,
+                                                   guint                  min_args,
+                                                   guint                  max_args,
+                                                   guint (* parse_func) (GtkCssParser *, guint, gpointer),
+                                                   gpointer               data);
+
 gboolean        _gtk_css_parser_has_number        (GtkCssParser          *parser);
 char *          _gtk_css_parser_read_string       (GtkCssParser          *parser);
 GFile *         _gtk_css_parser_read_url          (GtkCssParser          *parser);